home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_11 / phillip2 / wtiff.c < prev    next >
C/C++ Source or Header  |  1993-06-07  |  21KB  |  719 lines

  1.  
  2.        /**********************************************
  3.        *
  4.        *  file d:\cips\wtiff.c
  5.        *
  6.        *  Functions: This file contains
  7.        *      create_file_if_needed
  8.        *      create_allocate_tiff_file
  9.        *      write_array_into_tiff_image
  10.        *      write_line
  11.        *      insert_short_into_buffer
  12.        *      insert_long_into_buffer
  13.        *      round_off_image_size
  14.        *      does_not_exist
  15.        *
  16.        *  Purpose:
  17.        *     These functions create TIFF image files 
  18.        *     on disk and insert a ROWSxCOLS array
  19.        *     into a tiff image already stored on disk.
  20.        *
  21.        *  External Calls:
  22.        *     rtiff.c - seek_to_first_line
  23.        *               seek_to_end_of_line
  24.        *     tiff.c - read_tiff_header
  25.        *
  26.        *  Modifications:
  27.        *     29 January 1991 - created
  28.        *     28 March 1993 - replaced open, lseek
  29.        *         etc. with fopen, fseek, etc.
  30.        *     10 May 1993 - added a number of tags
  31.        *         to make the TIFF files I create
  32.        *         TIFF 6.0 Gray Scale image compliant.
  33.        *
  34.        *********************************************/
  35.  
  36. #include "cips.h"
  37.  
  38.  
  39.  
  40.  
  41.  
  42.        /**********************************************
  43.        *
  44.        *   create_file_if_needed(...
  45.        *
  46.        *   This function creates a file on disk
  47.        *   if it does not exist.  The out file is
  48.        *   patterned after the in file.
  49.        *
  50.        ***********************************************/
  51.  
  52. create_file_if_needed(in_name, out_name, out_image)
  53.    char in_name[], out_name[];
  54.    short out_image[ROWS][COLS];
  55. {
  56.    int    length, width;
  57.    struct tiff_header_struct image_header;
  58.  
  59.    if(does_not_exist(out_name)){
  60.       printf("\n\n output file does not exist %s",
  61.                out_name);
  62.       read_tiff_header(in_name, &image_header);
  63.       round_off_image_size(&image_header,
  64.                            &length, &width);
  65.       image_header.image_length = length*ROWS;
  66.       image_header.image_width  = width*COLS;
  67.       create_allocate_tiff_file(out_name, &image_header,
  68.                                 out_image);
  69.    }  /* ends if does_not_exist */
  70. }  /* ends create_file_if_needed */
  71.  
  72.  
  73.  
  74.  
  75.  
  76.    /**********************************************
  77.    *
  78.    *   create_alllocate_tiff_file(...
  79.    *
  80.    *   This function creates a file on disk that will be
  81.    *   large enough to hold a tiff image.  The input
  82.    *   tiff_header_struct describes the desired tiff file.
  83.    *   This function writes the tiff header and then
  84.    *   writes a blank image array out to disk the proper
  85.    *   number of times.  This has the effect of allocating
  86.    *   the correct number of bytes on the disk.
  87.    *
  88.    *   There will be 18 entries in the IFD.
  89.    *   The image data will begin at byte 296.
  90.    *   I will use LSB first data.
  91.    *   I will have one strip for the entire image.
  92.    *   Black is zero.
  93.    *   The component values for the image are CHUNKY
  94.    *      (Planer configuration = 1).
  95.    *
  96.    ***************************************************/
  97.  
  98.  
  99. create_allocate_tiff_file(file_name, 
  100.                           image_header, image)
  101.    char   file_name[];
  102.    short  image[ROWS][COLS];
  103.    struct tiff_header_struct *image_header;
  104. {
  105.    char  buffer[12], long_buffer[50];
  106.    FILE  *image_file;
  107.    int   bytes_written,
  108.          i,
  109.          j,
  110.          l,
  111.          w;
  112.  
  113.    long  k;
  114.  
  115.  
  116.  
  117.       /***************************************
  118.       *
  119.       *   Create the image file in binary mode
  120.       *   for both reading and writing.
  121.       *
  122.       ****************************************/
  123.  
  124.    image_file = fopen(file_name, "wb");
  125.  
  126.       /***************************************
  127.       *
  128.       *   Write out the first 8 bytes of the
  129.       *   header.  The meaning of the
  130.       *   bytes (HEX) is:
  131.       *      0-1 = 49 49 - LSB first
  132.       *      2-3 = 2A 00 - version #
  133.       *      4-7 = 08 00 00 00 - go to offset
  134.       *           8 for the first
  135.       *           Image File
  136.       *           Directory
  137.       *
  138.       ****************************************/
  139.  
  140.    buffer[0] = 0x49;
  141.    buffer[1] = 0x49;
  142.    buffer[2] = 0x2A;
  143.    buffer[3] = 0x00;
  144.    buffer[4] = 0x08;
  145.    buffer[5] = 0x00;
  146.    buffer[6] = 0x00;
  147.    buffer[7] = 0x00;
  148.  
  149.    bytes_written = fwrite(buffer, 1, 8, image_file);
  150.  
  151.    printf("\n wrote %d bytes", bytes_written);
  152.  
  153.       /***************************************
  154.       *
  155.       *   Write out the first 2 bytes of the
  156.       *   Image File Directory.  These tell
  157.       *   the number of entries in the IFD.
  158.       *
  159.       ****************************************/
  160.  
  161.    buffer[0] = 0x12;
  162.    buffer[1] = 0x00;
  163.    bytes_written = fwrite(buffer, 1, 2, image_file);
  164.  
  165.    printf("\n wrote %d bytes", bytes_written);
  166.  
  167.       /***************************************
  168.       *
  169.       *   Write out the entries into the
  170.       *   Image File Directory.
  171.       *
  172.       ****************************************/
  173.  
  174.  
  175.       /* New Subfile Type */
  176.    buffer[0]  = 0xFE;
  177.    buffer[1]  = 0x00;
  178.    buffer[2]  = 0x03;
  179.    buffer[3]  = 0x00;
  180.    buffer[4]  = 0x01;
  181.    buffer[5]  = 0x00;
  182.    buffer[6]  = 0x00;
  183.    buffer[7]  = 0x00;
  184.    buffer[8]  = 0x00;
  185.    buffer[9]  = 0x00;
  186.    buffer[10] = 0x00;
  187.    buffer[11] = 0x00;
  188.    bytes_written = fwrite(buffer, 1, 12, image_file);
  189.    printf("\n wrote %d bytes", bytes_written);
  190.  
  191.  
  192.       /* Subfile Type */
  193.    buffer[0]  = 0xFF;
  194.    buffer[1]  = 0x00;
  195.    buffer[2]  = 0x03;
  196.    buffer[3]  = 0x00;
  197.    buffer[4]  = 0x01;
  198.    buffer[5]  = 0x00;
  199.    buffer[6]  = 0x00;
  200.    buffer[7]  = 0x00;
  201.    buffer[8]  = 0x01;
  202.    buffer[9]  = 0x00;
  203.    buffer[10] = 0x00;
  204.    buffer[11] = 0x00;
  205.    bytes_written = fwrite(buffer, 1, 12, image_file);
  206.    printf("\n wrote %d bytes", bytes_written);
  207.  
  208.  
  209.       /* Image Width */
  210.    insert_short_into_buffer(buffer, 0, 256);
  211.    insert_short_into_buffer(buffer, 2, 3);
  212.    insert_short_into_buffer(buffer, 4, 1);
  213.    insert_short_into_buffer(buffer, 8, 
  214.                      image_header->image_width);
  215.    bytes_written = fwrite(buffer, 1, 12, image_file);
  216.    printf("\n wrote %d bytes", bytes_written);
  217.  
  218.  
  219.       /* Image Length */
  220.    insert_short_into_buffer(buffer, 0, 257);
  221.    insert_short_into_buffer(buffer, 2, 3);
  222.    insert_short_into_buffer(buffer, 4, 1);
  223.    insert_short_into_buffer(buffer, 8, 
  224.                      image_header->image_length);
  225.    bytes_written = fwrite(buffer, 1, 12, image_file);
  226.    printf("\n wrote %d bytes", bytes_written);
  227.  
  228.  
  229.       /* Bits Per Sample */
  230.    insert_short_into_buffer(buffer, 0, 258);
  231.    insert_short_into_buffer(buffer, 2, 3);
  232.    insert_short_into_buffer(buffer, 4, 1);
  233.    insert_short_into_buffer(buffer, 8, 
  234.                      image_header->bits_per_pixel);
  235.    bytes_written = fwrite(buffer, 1, 12, image_file);
  236.    printf("\n wrote %d bytes", bytes_written);
  237.  
  238.  
  239.       /* Compression - None */
  240.    insert_short_into_buffer(buffer, 0, 259);
  241.    insert_short_into_buffer(buffer, 2, 3);
  242.    insert_short_into_buffer(buffer, 4, 1);
  243.    insert_short_into_buffer(buffer, 8, 1);
  244.    bytes_written = fwrite(buffer, 1, 12, image_file);
  245.    printf("\n wrote %d bytes", bytes_written);
  246.  
  247.  
  248.       /* Photometric Interpretation */
  249.       /* set to 1 because BLACK is ZERO */
  250.    insert_short_into_buffer(buffer, 0, 262);
  251.    insert_short_into_buffer(buffer, 2, 3);
  252.    insert_short_into_buffer(buffer, 4, 1);
  253.    insert_short_into_buffer(buffer, 8, 1);
  254.    bytes_written = fwrite(buffer, 1, 12, image_file);
  255.    printf("\n wrote %d bytes", bytes_written);
  256.  
  257.  
  258.       /* Strip Offset */
  259.       /* start after software name at 296 */
  260.    insert_short_into_buffer(buffer, 0, 273);
  261.    insert_short_into_buffer(buffer, 2, 3);
  262.    insert_short_into_buffer(buffer, 4, 1);
  263.    insert_short_into_buffer(buffer, 8, 296);
  264.    bytes_written = fwrite(buffer, 1, 12, image_file);
  265.    printf("\n wrote %d bytes", bytes_written);
  266.  
  267.  
  268.       /* Samples per Pixel */
  269.    insert_short_into_buffer(buffer, 0, 277);
  270.    insert_short_into_buffer(buffer, 2, 3);
  271.    insert_short_into_buffer(buffer, 4, 1);
  272.    insert_short_i